table of contents
READ(2) | Podręcznik programisty Linuksa | READ(2) |
NAZWA¶
read - odczyt z deskryptora pliku
SKŁADNIA¶
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
OPIS¶
read() próbuje odczytać maksymalnie count bajtów z deskryptora plików fd do bufora, którego początek znajduje się w buf.
Jeśli count jest równe zero, read() zwraca zero i nic więcej się nie dzieje. Jeśli count jest większe niż SSIZE_MAX, wynik jest nieokreślony.
WARTOŚĆ ZWRACANA¶
Po pomyślnym zakończeniu zwracana jest liczba odczytanych bajtów (zero oznacza koniec pliku), oraz o tę wartość przesuwana jest pozycja w pliku. Nie jest błędem, jeśli liczba ta jest mniejsza niż liczba żądanych bajtów; może się to zdarzyć np. ponieważ chwilowo dostępnych jest mniej bajtów (może z powodu bliskości końca plików, a może z powodu czytania z potoku lub z terminala), lub ponieważ read() zostało przerwane sygnałem. Po błędzie zwracane jest -1 i odpowiednio ustawiane errno. W tym wypadku nie jest określone czy pozycja w pliku się zmieni.
BŁĘDY¶
- EINTR
- Wywołanie zostało przerwane sygnałem przed odczytaniem danych.
- EAGAIN
- Przy użyciu O_NONBLOCK wybrano nieblokujące we/wy, a nie ma akurat danych dostępnych do odczytania natychmiast.
- EIO
- Błąd we/wy. Zdarza się to na przykład, gdy proces jest w grupie procesów tła próbuje czytać z kontrolującego tty, i blokuje lub ignoruje sygnał SIGTTIN, lub jego grupa procesów jest osierocona. Może się to również zdarzyć, gdy wystąpi niskopoziomowy błąd we/wy podczas odczytu z dysku lub taśmy.
- EISDIR
- fd odnosi się do katalogu.
- EBADF
- fd nie jest prawidłowym deskryptorem pliku, lub nie jest otwarty dla odczytu.
- EINVAL
- fd wskazuje na obiekt nieodpowiedni do odczytu.
- EINVAL
- fd jest skojarzony z obiektem, który nie jest odpowiedni dla odczytu.
- EFAULT
- buf wskazuje poza dostępną dla użytkownika przestrzeń adresową.
Mogą się pojawić inne błędy, zależnie od obiektu skojarzonego z fd. POSIX zezwala by read którego przerwano po odczytaniu fragmentu danych zwrócił -1 (z errno ustawionym na EINTR) lub by zwróćił ilość odczytanych bajtów.
ZGODNE Z¶
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
OGRANICZENIA¶
Na systemach plików NFS, odczytanie niewielkiej ilości danych spowoduje uaktualnienie znacznika czasu tylko za pierwszym razem. Następne wywołania tego nie uczynią. Jest to związana z buforowaniem atrybutów po stronie klienta, gdyż większość (jeżeli nie wszystkie) klienty NFS pozostawiają uaktualnianie atime serwerowi, a odczyty po stronie klienta, odbywające się z buforów klienta nie spowodują uaktualnienia atime na serwerze, gdyż nie ma wówczas odczytów po stronie serwera. Semantykę UNIX-a można uzyskać poprzez wyłączenie buforowania atrybutów po stronie klienta. Jednakże, w większości przypadków spowoduje to istotny wzrost obciążenia serwera i zmniejszy wydajność.
Wiele systemów plików i dysków jest uważane za dostatecznie szybkie, aby implementacja O_NONBLOCK była uważana za zbędną. Tak więc, O_NONBLOCK może nie być dostępne dla plików i/lub dysków.
ZOBACZ TAKŻE¶
close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3)
1997-07-12 | Linux 2.0.32 |